#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
void test1()
{	//1,int execl(const char* path,const char* arg,...);
//	printf("我的程序execl开始运行！\n");
//	sleep(1);
//	int ret1=execl("/usr/bin/ls","ls","-l","-a",NULL);
//	if(ret1==-1)
//	{
//		printf("程序运行失败\n");
//		exit(1);
//	}
	//2,int execlp(const char* file,const char* arg,...);
	//printf("我的程序execlp开始运行！\n");
	//sleep(1);
	//int ret2=execlp("ls","ls","-l","-a",NULL);//会在环境变量PATH中寻找ls命令
	//if(ret2==-1)
	//{
	//	printf("程序运行失败\n");
	//	exit(1);
	//}
	//3,execv(const char* path,char* const argv[]);
//	printf("我的程序execv开始运行！\n");
//	sleep(1);
//	char* const argv[]={
//		"ls","-l","-a",NULL
//	};
//	int ret3=execv("/usr/bin/ls",argv);
//	if(ret3==-1)
//	{
//		printf("程序运行失败\n");
//		exit(1);
//	}
	//4,int execvp(const char* file,char* const argv[]);
//	printf("我的程序execvp开始运行！\n");
//	sleep(1);
//	char* const argv[]={
//		"ls","-l","-a",NULL
//	};
//	int ret4=execvp("ls",argv);
//	if(ret4==-1)
//	{
//		printf("程序运行失败\n");
//		exit(1);
//	}
	//5,int execvpe(const char* file,char* const argv[],char* const envp[]);
}
void test2()
{
//自己调用自己的程序
//	printf("我将开始调用自己写的程序mine.c\n");
//	sleep(1);
//	char* const argv[]={
//		"mine",NULL
//	};
//	char* const env[]={
//		(char* const)"MYVAL=1234",NULL
//	};
//	int ret=execvpe("./mine",argv,env);
//	if(ret==-1)
//	{
//
//		printf("程序调用失败\n");
//		exit(1);
//	}



//	如果我们传了env参数，那么则会用全新的env列表，那我们现在尝试新增环境变量的方式：
//#include<stdlib.h>-->int putenv(char* string);
	printf("我将开始调用自己写的程序mine.c\n");
	sleep(1);
	char* const argv[]={
		"mine",NULL
	};
	char* const env[]={
		(char* const)"MYVAL1=1234",
		(char* const)"MYVAL2=5678",
		(char* const)"MYVAL3=9999",
		NULL
	};
	int i=0;
	for(;env[i];i++)
	{
		putenv(env[i]);
	}
	extern char** environ;
	int ret=execvpe("./mine",argv,environ);
	if(ret==-1)
	{

		printf("程序调用失败\n");
		exit(1);
	}
}
int main()
{

	//test1();//首先测试exe*类的函数接口
	//测试环境变量
	//int i=0;
//	for(;env[i];i++)
//	{
//
//		printf("env[%d]->%s\n",i,env[i]);
//	}
	test2();
	return 0;
}
